#pragma once

namespace tblib
{
	template <typename T, typename U>
	void enlarge(T& t, const U& u)
	{ if (t<u) t=u; }

	template <typename T, typename U>
	void shrink(T& t, const U& u)
	{ if (t>u) t=u; }

	template <typename T, typename U>
	void inbound(T& t, const U& u1, const U& u2)
	{ if (t<u1) t=u1; else if (t>u2) t=u2; }

	template <typename T> void recreate (T& t)
			{ t.~T(); new(&t) T(); }

	template <typename T, typename A1> void recreate (T& t, const A1& a1)
		{ t.~T(); new(&t) T(a1); }

	template <typename T, typename A1, typename A2> void recreate (T& t, const A1& a1, const A2& a2)
		{ t.~T(); new(&t) T(a1, a2); }

	template <typename T, typename A1, typename A2, typename A3> void recreate (T& t, const A1& a1, const A2& a2, const A3& a3)
		{ t.~T(); new(&t) T(a1, a2, a3); }

	template <typename T, typename A1, typename A2, typename A3, typename A4> void recreate (T& t, const A1& a1, const A2& a2, const A3& a3, const A4& a4)
		{ t.~T(); new(&t) T(a1, a2, a3, a4); }

	template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5> void recreate (T& t, const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5)
		{ t.~T(); new(&t) T(a1, a2, a3, a4, a5); }
}
